]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
blur-effect: Don't use stage view when drawing off-stage
authorJonas Dreßler <verdre@v0yd.nl>
Sat, 13 Feb 2021 15:07:22 +0000 (16:07 +0100)
committerRobert Mader <robert.mader@posteo.de>
Mon, 15 Feb 2021 12:17:08 +0000 (13:17 +0100)
When we're painting off-stage, for example because we're screencasting
or taking a screenshot, there won't be a stage-view associated with the
paint context. The BlurEffect previously didn't handle that case and
would crash.

Fix that and handle that case by assuming the scale is 1 and not
offsetting the rectangle we blit from the draw framebuffer.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1673>

src/shell-blur-effect.c

index 16bf086de68d3f8e472d595b2761369119276974..8ea333f0cfabaed1cf6d0995f4418807a55b78db 100644 (file)
@@ -327,7 +327,6 @@ update_actor_box (ShellBlurEffect     *self,
   float box_scale_factor = 1.0f;
   float origin_x, origin_y;
   float width, height;
-  cairo_rectangle_int_t stage_view_layout;
 
   switch (self->mode)
     {
@@ -337,14 +336,26 @@ update_actor_box (ShellBlurEffect     *self,
 
     case SHELL_BLUR_MODE_BACKGROUND:
       stage_view = clutter_paint_context_get_stage_view (paint_context);
-      box_scale_factor = clutter_stage_view_get_scale (stage_view);
-      clutter_stage_view_get_layout (stage_view, &stage_view_layout);
 
       clutter_actor_get_transformed_position (self->actor, &origin_x, &origin_y);
       clutter_actor_get_transformed_size (self->actor, &width, &height);
 
-      origin_x -= stage_view_layout.x;
-      origin_y -= stage_view_layout.y;
+      if (stage_view)
+        {
+          cairo_rectangle_int_t stage_view_layout;
+
+          box_scale_factor = clutter_stage_view_get_scale (stage_view);
+          clutter_stage_view_get_layout (stage_view, &stage_view_layout);
+
+          origin_x -= stage_view_layout.x;
+          origin_y -= stage_view_layout.y;
+        }
+      else
+        {
+          /* If we're drawing off stage, just assume scale = 1, this won't work
+           * with stage-view scaling though.
+           */
+        }
 
       clutter_actor_box_set_origin (source_actor_box, origin_x, origin_y);
       clutter_actor_box_set_size (source_actor_box, width, height);